home *** CD-ROM | disk | FTP | other *** search
/ Ray Dream Studio / Ray Dream Studio (CDRAYD1) (Ray Dream) (1995).iso / DREAMSDK.WIN / INCLUDE / QMATH.H < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-06  |  23.0 KB  |  469 lines  |  [TEXT/mdos]

  1. /* $Id: qmath.h 1.2 1995/06/29 11:17:11 michel Exp $ */
  2.  
  3. /*$RDGNU$*/
  4. #ifndef __QMATH__
  5. #define __QMATH__
  6.  
  7. #ifndef __MTYPES__
  8. #include "mtypes.h"
  9. #endif
  10.  
  11. #ifdef qQFixIsFloat
  12. #ifndef __FP__
  13. #include <fp.h>
  14. #endif
  15. #endif
  16.  
  17. class  QuickFix;
  18. class  QuickWide;
  19. class  QuickFixVector2;
  20. class  QuickFixVector3;
  21. class Riostream;
  22.  
  23. //******************************************************************
  24. extern const QuickFix kQuickFixMinusOne;
  25. extern const QuickFix kQuickFixOne;
  26. extern const QuickFix kQuickFixZero;
  27. extern const QuickFix kQuickFixMax;
  28. extern const QuickFix kQuickFixMin;
  29. extern const QuickFix kQuickFixEpsilon;
  30. extern const QuickFix kQuickFixOneHalf;
  31. extern const QuickFix kQuickFixOneThird;
  32. extern const QuickFix kQuickFixTwoThird;
  33. extern const QuickFix kQuickFixOneFourth;
  34. extern const QuickFix kQuickFixPi;
  35. extern const QuickFix kQuickFixTwoPi;
  36. extern const QuickFix kQuickFixPiHalf;
  37. extern const QuickFix kQuickFixPiThird;
  38. extern const QuickFix kQuickFixPiFourth;
  39. extern const QuickFix kQuickFixRadToDeg;
  40. extern const QuickFix kQuickFixDegToRad;
  41. extern const QuickFix kQuickFixBig;
  42.  
  43. extern const QuickWide kQuickWideOne;
  44. extern const QuickWide kQuickWideMinusOne;
  45. extern const QuickWide kQuickWideZero;
  46. extern const QuickWide kQuickWideMax;
  47. extern const QuickWide kQuickWideMin;
  48. extern const QuickWide kQuickWideEpsilon;
  49. extern const QuickWide kQuickWideOneHalf;
  50.  
  51. //******************************************************************
  52. enum SignJFS {kNeg=-1,kZero=0,kPos=1};
  53.  
  54. class  QuickFix {
  55. public:
  56.     void operator+=(const QuickFix &xx) {fData+=xx.fData;}
  57.     void operator-=(const QuickFix &xx) {fData-=xx.fData;}
  58.     //QuickFix operator-() const  {QuickFix buf; buf.fData=-fData; return buf;}
  59.     Boolean operator<(const QuickFix &xx) const {return Boolean(fData<xx.fData);}
  60.     Boolean operator>(const QuickFix &xx) const {return Boolean(fData>xx.fData);}
  61.     Boolean operator<=(const QuickFix &xx) const {return Boolean(fData<=xx.fData);}
  62.     Boolean operator>=(const QuickFix &xx) const {return Boolean(fData>=xx.fData);}
  63.     Boolean operator!=(const QuickFix &xx) const {return Boolean(fData!=xx.fData);}
  64.     Boolean operator==(const QuickFix &xx) const {return Boolean(fData==xx.fData);}
  65.     QuickFix operator>>(unsigned short ss) const {QuickFix buf=*this; buf>>=ss; return(buf);}
  66.     QuickFix operator<<(unsigned short ss) const {QuickFix buf=*this; buf<<=ss; return(buf);}
  67.     void MultiplyNoFail(const QuickFix &xx);
  68.     void Log2(short &result) const;
  69. #ifdef qQFixIsFloat
  70.     void operator*=(const QuickFix &xx) {fData*=xx.fData;}
  71.     void operator/=(const QuickFix &xx) {fData/=xx.fData;}
  72.     void operator>>=(unsigned short ss) {fData=ldexp(fData,-ss);}
  73.     void operator<<=(unsigned short ss) {fData=ldexp(fData,ss);}
  74.     QuickFix Absolute(void) const {QuickFix buf; buf.fData=fabs(fData); return buf;}
  75.     void GetSquareRoot(QuickFix &sqroot) const {sqroot.fData=sqrt(fData);};
  76.     void SetFromSquare(const QuickFix &sqr) {fData=sqrt(sqr.fData);};
  77.     void GetSinCos(QuickFix &sinus,QuickFix &cosinus) const {sinus.fData=sin(fData); cosinus.fData=cos(fData);}
  78.     void SetFromSinCos(const QuickFix &sinus,const QuickFix &cosinus) {fData=atan2(sinus.fData,cosinus.fData); if (fData<0) fData+=pi;}
  79.     void DegreeGetSinCos(QuickFix &sinus,QuickFix &cosinus) const {double tmp=(fData*180)/pi; sinus.fData=sin(tmp); cosinus.fData=cos(tmp);}
  80.     void DegreeSetFromSinCos(const QuickFix &sinus,const QuickFix &cosinus) {SetFromSinCos(sinus,cosinus);fData*=(180/pi);}
  81. #else
  82.     void operator*=(const QuickFix &xx);
  83.     void operator/=(const QuickFix &xx);
  84.     void operator>>=(unsigned short ss) {fData>>=ss;}
  85.     void operator<<=(unsigned short ss) {fData<<=ss;}
  86.     QuickFix Absolute(void) const {QuickFix buf; if (fData<0) buf.fData=-fData; else buf.fData=fData; return buf;}
  87.     void GetSquareRoot(QuickFix &sqroot) const;
  88.     void SetFromSquare(const QuickFix &sqr);
  89.     void GetSinCos(QuickFix &sinus,QuickFix &cosinus) const;
  90.     void SetFromSinCos(const QuickFix &sinus,const QuickFix &cosinus);
  91.     void DegreeGetSinCos(QuickFix &sinus,QuickFix &cosinus) const; 
  92.     void DegreeSetFromSinCos(const QuickFix &sinus,const QuickFix &cosinus);
  93. #endif
  94. protected:
  95. #ifdef qQFixIsFloat
  96.     float    fData;
  97. #else
  98.     long    fData;
  99. #endif
  100. private:
  101.     friend inline QuickFix operator-(const QuickFix &xx);
  102.     friend inline QuickFix  operator-(const QuickFix &xx,const QuickFix &yy);
  103.     friend inline QuickFix  operator+(const QuickFix &xx,const QuickFix &yy);
  104.     friend inline QuickFix  Qfloor(const QuickFix &xx);
  105.     friend inline QuickFix  Qceil(const QuickFix &xx);
  106.     friend inline QuickFix  QuickWideSqrt(const QuickWide& xx);
  107.     friend inline short QuickFixToShort(const QuickFix &xx);
  108.     friend inline short  RoundQuickFixToShort (const QuickFix &xx);
  109.     friend inline short  TruncQuickFixToShort (const QuickFix &xx);
  110.     friend inline long  QuickFixToFixed(const QuickFix &xx);
  111.     friend inline QuickFix FixedToQuickFix(long xx);
  112.     friend inline QuickFix  ShortToQuickFix(short xx);
  113.     friend QuickFix  DoubleToQuickFix(double value);
  114.     friend void  QuickFixToDouble(const QuickFix &xx,double &value);
  115.  
  116.  
  117.     friend class QuickFixVector3;
  118.     friend class QuickFixVector2;
  119.     friend class MagicSegmentIntersect;
  120.     
  121.     friend SignJFS  SetDiscriminant(QuickFix &res,const QuickFix &aa,const QuickFix &bb,const QuickFix &cc);
  122.     friend QuickWide  QuickFixDet(const QuickFixVector2 &V1,const QuickFixVector2 &V2);
  123.  
  124.     friend QuickFixVector2  operator+(const QuickFixVector2 &UU,const QuickFixVector2 &VV);
  125.     friend QuickFixVector2  operator-(const QuickFixVector2 &UU,const QuickFixVector2 &VV);
  126.     friend QuickFixVector3  operator+(const QuickFixVector3 &UU,const QuickFixVector3 &VV);
  127.     friend QuickFixVector3  operator-(const QuickFixVector3 &UU,const QuickFixVector3 &VV);
  128.  
  129. #if 0
  130.     friend Riostream&  operator<<(Riostream&ss,const QuickFix &xx);
  131.     friend Riostream&  operator>>(Riostream&ss,QuickFix &xx);
  132. #endif
  133.  
  134. #ifdef qQFixIsFloat
  135.     friend inline QuickFix  operator* (const QuickFix &xx,const QuickFix &yy);
  136.     friend inline QuickFix  operator/ (const QuickFix &xx,const QuickFix &yy);
  137.     friend inline QuickFix SquareRoot(const QuickFix &xx);
  138.     friend inline QuickWide  QuickMulWide (const QuickFix& xx, const QuickFix& yy);
  139.     friend inline QuickFix operator*(short xx,const QuickFix &yy); 
  140.     friend inline QuickFix operator/(const QuickFix &xx,short yy);
  141.     friend inline QuickFix  QuickNorm(const QuickFix xx, const QuickFix yy);
  142.     friend inline QuickFix  QuickNorm(const QuickFix xx, const QuickFix yy, const QuickFix zz);
  143. #else
  144.     friend QuickFix  operator* (const QuickFix &xx,const QuickFix &yy);
  145.     friend QuickFix  operator/ (const QuickFix &xx,const QuickFix &yy);
  146.     friend QuickFix SquareRoot(const QuickFix &xx);
  147.     friend QuickWide  QuickMulWide (const QuickFix& xx, const QuickFix& yy);
  148.     friend QuickFix  QuickNorm(const QuickFix xx, const QuickFix yy);
  149.     friend QuickFix  QuickNorm(const QuickFix xx, const QuickFix yy, const QuickFix zz);
  150.     //only to be used by QMath.cpp
  151.     friend QuickFix  QuickNormalizeRoot(short count,const QuickFix *PP,QuickFix *QQ);
  152.     friend QuickWide  QuickSquaredNorm(short count, const QuickFix *PP);
  153. #endif
  154. };
  155.  
  156. inline QuickFix operator-(const QuickFix &xx) {QuickFix buf; buf.fData=-xx.fData; return buf;}
  157. inline QuickFix  operator-(const QuickFix &xx,const QuickFix &yy) {QuickFix buf; buf.fData=xx.fData-yy.fData; return buf;}
  158. inline QuickFix  operator+(const QuickFix &xx,const QuickFix &yy) {QuickFix buf; buf.fData=xx.fData+yy.fData; return buf;}
  159. QuickFix  RadToDeg(const QuickFix &xx);
  160. QuickFix  DegToRad(const QuickFix &xx);
  161.  
  162. #ifdef qQFixIsFloat
  163. inline QuickFix operator*(short xx,const QuickFix &yy) {QuickFix buf; buf.fData=yy.fData*xx; return buf;}
  164. inline QuickFix operator/(const QuickFix &xx,short yy) {QuickFix buf; buf.fData=xx.fData/yy; return buf;}
  165. inline QuickFix  Qfloor(const QuickFix &xx) {QuickFix buf; buf.fData=floor(xx.fData); return buf;}
  166. inline QuickFix  Qceil(const QuickFix &xx) {QuickFix buf; buf.fData=ceil(xx.fData); return buf;}
  167. inline QuickFix  operator*(const QuickFix &xx,const QuickFix &yy) {QuickFix buf; buf.fData=xx.fData*yy.fData; return buf;}
  168. inline QuickFix  operator/(const QuickFix &xx,const QuickFix &yy) {QuickFix buf; buf.fData=xx.fData/yy.fData; return buf;}
  169. inline QuickFix SquareRoot(const QuickFix &xx) {QuickFix buf; buf.fData=sqrt(xx.fData); return buf;}
  170. inline QuickFix QuickNorm(const QuickFix xx, const QuickFix yy) {QuickFix buf; buf.fData = hypot(xx.fData,yy.fData); return buf;}
  171. inline QuickFix QuickNorm(const QuickFix xx, const QuickFix yy, const QuickFix zz) {QuickFix buf; double temp; temp = sqrt(xx.fData*xx.fData+yy.fData*yy.fData+zz.fData*zz.fData); buf.fData = temp; return buf;}
  172. #else
  173. QuickFix operator*(short xx,const QuickFix &yy); 
  174. QuickFix operator/(const QuickFix &xx,short yy);
  175. inline QuickFix  Qfloor(const QuickFix &xx) {QuickFix buf; buf.fData=xx.fData & 0xFFFF0000; if (buf.fData>xx.fData) buf.fData -= 0x00010000; return buf;}
  176. inline QuickFix  Qceil(const QuickFix &xx) {QuickFix buf; buf.fData=xx.fData & 0xFFFF0000; if (buf.fData<xx.fData) buf.fData += 0x00010000; return buf;}
  177. QuickFix  operator*(const QuickFix &xx,const QuickFix &yy);
  178. QuickFix  operator/(const QuickFix &xx,const QuickFix &yy);
  179. QuickFix SquareRoot(const QuickFix &xx);
  180. #endif
  181.  
  182. //*********************************************************************
  183.  
  184. class  QuickWide {
  185. public:
  186.     QuickWide operator+(QuickWide xx) const {QuickWide buf=*this; buf+=xx; return buf;}
  187.     QuickWide operator-(QuickWide xx) const {QuickWide buf=*this; buf-=xx; return buf;}
  188.     QuickWide operator-(void) const {QuickWide buf=*this; buf.Negate(); return buf;}
  189.     QuickWide operator>>(unsigned short ss) const {QuickWide buf=*this; buf>>=ss; return(buf);}
  190.     QuickWide operator<<(unsigned short ss) const {QuickWide buf=*this; buf<<=ss; return(buf);}
  191. #ifdef qQFixIsFloat
  192.     void Negate(void) {fData=-fData;}
  193.     void operator+=(const QuickWide& xx) {fData+=xx.fData;}
  194.     void operator-=(const QuickWide& xx) {fData-=xx.fData;}
  195.     void operator>>=(unsigned short ss) {fData=ldexp(fData,-ss);}
  196.     void operator<<=(unsigned short ss) {fData=ldexp(fData,ss);}
  197.     Boolean operator<(const QuickWide &xx) const {return Boolean(fData<xx.fData);}
  198.     Boolean operator>(const QuickWide &xx) const {return Boolean(fData>xx.fData);}
  199.     Boolean operator<=(const QuickWide &xx) const {return Boolean(fData<=xx.fData);}
  200.     Boolean operator>=(const QuickWide &xx) const {return Boolean(fData>=xx.fData);}
  201.     Boolean operator!=(const QuickWide &xx) const {return Boolean(fData!=xx.fData);}
  202.     Boolean operator==(const QuickWide &xx) const {return Boolean(fData==xx.fData);}
  203.     SignJFS GetSign(void) const {if (fData<0) return kNeg; else if (fData>0) return kPos; else return kZero;}
  204.     void Absolute(void) {fData=fabs(fData);}
  205.     unsigned long SquareRoot(void) const {return(sqrt(fData));}
  206. #else
  207.     void Negate(void) {fLo=(unsigned long)(-(long)fLo); if (fLo==0) fHi=-fHi; else fHi=~fHi;}
  208.     void operator+=(const QuickWide& xx) {unsigned long oldLo=fLo; fLo+=xx.fLo; fHi+=xx.fHi; if (fLo<oldLo) fHi++;}
  209.     void operator-=(const QuickWide& xx) {QuickWide buf=xx; buf.Negate(); (*this) += buf;}
  210.     void operator>>=(unsigned short ss); 
  211.     void operator<<=(unsigned short ss); 
  212.     Boolean operator>=(QuickWide xx) const {if (fHi>xx.fHi) return TRUE; else if (fHi<xx.fHi) return FALSE; else return Boolean(fLo>=xx.fLo);}
  213.     Boolean operator>(QuickWide xx) const {if (fHi>xx.fHi) return TRUE; else if (fHi<xx.fHi) return FALSE; else return Boolean(fLo>xx.fLo);}
  214.     Boolean operator<(QuickWide xx) const {if (fHi<xx.fHi) return TRUE; else if (fHi>xx.fHi) return FALSE; else return Boolean(fLo<xx.fLo);}
  215.     Boolean operator<=(QuickWide xx) const {if (fHi<xx.fHi) return TRUE; else if (fHi>xx.fHi) return FALSE; else return Boolean(fLo<=xx.fLo);}
  216.     Boolean operator==(QuickWide xx) const {return Boolean((fHi==xx.fHi)&&(fLo==xx.fLo));}
  217.     Boolean operator!=(QuickWide xx) const {return Boolean((fHi!=xx.fHi)||(fLo!=xx.fLo));}
  218.     SignJFS GetSign(void) const ;
  219.     void Absolute(void) {if (GetSign()<0) (*this)=-(*this);}
  220.     unsigned long SquareRoot(void) const;
  221. #endif
  222. //    QuickWide operator>>(short ss) const {QuickWide buf=*this; if (ss<=32) {buf.fLo>>=ss; buf.fLo^=buf.fHi<<(32-ss);    buf.fHi>>=ss;}else {buf.fLo=buf.fHi>>(ss-32);  buf.fHi=0;} return buf;}
  223. //    QuickWide operator<<(short ss) const {QuickWide buf=*this; if (ss>32) {buf.fLo=0; buf.fHi=buf.fLo<<(ss-32);} else {buf.fHi<<=ss;buf.fHi^=buf.fLo>>(32-ss);buf.fLo<<=ss; } return buf;}
  224. protected:
  225. #ifdef qQFixIsFloat
  226.     double fData;
  227. #else
  228.     long    fHi;
  229.     unsigned long fLo;
  230.     int GetFirstOnePosition(void) const;
  231. #endif
  232. private:
  233.     friend class MagicSegmentIntersect;
  234.     friend class QuickFixVector2;
  235.     friend class QuickFixVector3;
  236.     friend QuickWide  QuickFixDet(const QuickFixVector2 &V1,const QuickFixVector2 &V2);
  237.     friend SignJFS  SetDiscriminant(QuickFix &res,const QuickFix &aa,const QuickFix &bb,const QuickFix &cc);
  238.     friend QuickWide  QuickMulWide (const QuickFix& xx, const QuickFix& yy);
  239.     friend inline QuickWide  LongToQuickWide(long xx);
  240.     friend inline long QWfloor(const QuickWide &xx);
  241.     friend inline long QWceil(const QuickWide &xx);
  242.     friend inline QuickFix  QuickWideSqrt(const QuickWide& xx);
  243. #ifdef qQFixIsFloat
  244.     friend inline QuickFix operator/(const QuickWide &xx,const QuickWide &yy);
  245. #else
  246.     friend QuickFix operator/(const QuickWide &xx,const QuickWide &yy);
  247. #endif
  248. //these should only be used by QMathCst or QMath.cpp
  249. #ifdef qQFixIsFloat
  250.     friend QuickWide DoubleToQuickWide(double xx);
  251. #else
  252.     friend QuickWide DoubleLongToQuickWide(long xx, unsigned long yy);
  253.     friend QuickFix  QuickNormalizeRoot(short count,const QuickFix *PP,QuickFix *QQ);
  254.     friend QuickWide  QuickSquaredNorm(short count, const QuickFix *PP);
  255. #endif
  256.     };
  257.  
  258. #ifdef qQFixIsFloat
  259. inline QuickWide QuickMulWide(const QuickFix& xx, const QuickFix& yy) {QuickWide res; res.fData=xx.fData*yy.fData; return res;}
  260. inline long QWfloor(const QuickWide &xx) {long buf; buf=floor(xx.fData); return buf;}
  261. inline long QWceil(const QuickWide &xx) {long buf; buf=ceil(xx.fData); return buf;}
  262. inline QuickFix  QuickWideSqrt(const QuickWide& xx) {QuickFix res; res.fData = sqrt(xx.fData); return res;}
  263. #else
  264. QuickWide QuickMulWide(const QuickFix& xx, const QuickFix& yy);
  265. inline long QWfloor(const QuickWide &xx) {long buf; buf=xx.fHi; if (buf<0 && xx.fLo!=0) buf-=1; return buf;}
  266. inline long QWceil(const QuickWide &xx) {long buf; buf=xx.fHi; if (buf>0 && xx.fLo!=0) buf+=1; return buf;}
  267. inline QuickFix  QuickWideSqrt(const QuickWide& xx) {QuickFix res; res.fData = xx.SquareRoot(); return res;}
  268. #endif
  269.  
  270. //******************************************************************
  271.  
  272. #ifdef qQFixIsFloat
  273. inline QuickFix  ShortToQuickFix(short xx) {QuickFix buf; buf.fData=xx; return buf;}
  274. inline QuickFix  DoubleToQuickFix(double value) {QuickFix buf; buf.fData=value; return buf;}
  275. inline void  QuickFixToDouble(const QuickFix &xx,double &value) {value=xx.fData;}
  276. inline QuickFix FixedToQuickFix(long xx) {QuickFix buf;buf.fData=(xx/65536.0); return buf;}
  277. inline long  QuickFixToFixed(const QuickFix &xx) {return (xx.fData*65536.0);}
  278. inline short  QuickFixToShort(const QuickFix &xx) {return (xx.fData);}
  279. inline short  RoundQuickFixToShort(const QuickFix &xx) {return round(xx.fData);}
  280. inline short  TruncQuickFixToShort(const QuickFix &xx) {return trunc(xx.fData);}
  281. inline QuickWide LongToQuickWide(long xx) {QuickWide buf; buf.fData=xx; return buf;}
  282. #else
  283. inline QuickFix  ShortToQuickFix(short xx) {long buf=xx; buf<<=16; return *((QuickFix*)&buf);}
  284. QuickFix  DoubleToQuickFix(double value);
  285. void  QuickFixToDouble(const QuickFix &xx,double &value);
  286. inline QuickFix FixedToQuickFix(long xx) {QuickFix buf;buf.fData=xx; return buf;}
  287. inline long  QuickFixToFixed(const QuickFix &xx) {return xx.fData;}
  288. inline short  QuickFixToShort(const QuickFix &xx) { return short((xx.fData + 0x8000)>>16);}
  289. inline short  RoundQuickFixToShort (const QuickFix &xx) { return short((xx.fData + 0x8000)>>16);}
  290. inline short  TruncQuickFixToShort (const QuickFix &xx) { return short(xx.fData>>16);}
  291. inline QuickWide LongToQuickWide(long xx) {QuickWide buf; buf.fHi=xx; buf.fLo=0; return buf;}
  292. #endif
  293.  
  294.  
  295. //******************************************************************
  296. class  QuickFixVector2 {
  297. public:
  298.     QuickFixVector2() {}
  299.     QuickFixVector2(QuickFix p0, QuickFix p1) {fData[0]=p0;fData[1]=p1;}
  300.     const QuickFix& operator[](short ii)  const {return fData[ii];}
  301.     QuickFix& operator[](short ii)  {return fData[ii];}
  302.     QuickFix Normalize(QuickFixVector2 &res) const;
  303.     void Normalize();
  304.     QuickFix GetNorm();
  305.     QuickWide GetSquaredNorm();
  306. #ifdef qQFixIsFloat
  307.     void PseudoNormalize() {Normalize();}
  308. #else
  309.     void PseudoNormalize();
  310. #endif
  311.     QuickFixVector2 operator*(const QuickFix &kk) const;
  312.     QuickFixVector2 operator/(const QuickFix &kk) const;
  313.     QuickFixVector2 operator*=(const QuickFix &kk);
  314.     QuickFixVector2 operator/=(const QuickFix &kk);
  315.     Boolean operator!=(const QuickFixVector2 &xx) const;
  316.     Boolean operator==(const QuickFixVector2 &xx) const;
  317.     QuickFixVector2 operator-(void) const;
  318.     void operator+=(const QuickFixVector2& xx) {fData[0]+=xx.fData[0]; fData[1]+=xx.fData[1];}
  319.     void operator-=(const QuickFixVector2& xx) {fData[0]-=xx.fData[0]; fData[1]-=xx.fData[1];}
  320.     void operator>>=(unsigned short ss) {fData[0]>>=ss; fData[1]>>=ss;}
  321.     void operator<<=(unsigned short ss) {fData[0]<<=ss; fData[1]<<=ss;}
  322.     QuickFixVector2 operator>>(unsigned short ss) const {QuickFixVector2 buf=*this; buf[0]>>=ss; buf[1]>>=ss; return(buf);}
  323.     QuickFixVector2 operator<<(unsigned short ss) const {QuickFixVector2 buf=*this; buf[0]<<=ss; buf[1]<<=ss; return(buf);}
  324. protected:
  325.     QuickFix fData[2];
  326. private:
  327.     friend QuickWide  QuickFixDet(const QuickFixVector2 &V1,const QuickFixVector2 &V2);
  328. #if 0
  329.     friend Riostream&  operator<<(Riostream&ss,const QuickFixVector2 &xx);
  330.     friend Riostream&  operator>>(Riostream&ss,QuickFixVector2 &xx);
  331. #endif
  332.     };
  333. QuickFix  operator*(const QuickFixVector2 &UU,const QuickFixVector2 &VV);
  334. QuickFixVector2  operator+(const QuickFixVector2 &UU,const QuickFixVector2 &VV);
  335. QuickFixVector2  operator-(const QuickFixVector2 &UU,const QuickFixVector2 &VV);
  336.  
  337. class  QuickFixVector3 {
  338. public:
  339.     QuickFixVector3() {}
  340.     QuickFixVector3(QuickFix p0, QuickFix p1, QuickFix p2) {fData[0]=p0;fData[1]=p1;fData[2]=p2;}
  341.     const QuickFix & operator[](short ii) const {return fData[ii];}
  342.     QuickFix & operator[](short ii) {return fData[ii];}
  343.     QuickFix Normalize(QuickFixVector3 &res) const;
  344.     void Normalize();
  345.     QuickFix GetNorm() const;
  346.     QuickWide GetSquaredNorm();
  347. #ifdef qQFixIsFloat
  348.     void PseudoNormalize() {Normalize();}
  349. #else
  350.     void PseudoNormalize();
  351. #endif
  352.     QuickFixVector3 operator*(const QuickFix &kk) const;
  353.     QuickFixVector3 operator/(const QuickFix &kk) const;
  354.     QuickFixVector3& operator*=(const QuickFix &kk);
  355.     QuickFixVector3& operator/=(const QuickFix &kk);
  356.     Boolean operator!=(const QuickFixVector3 &xx) const;
  357.     Boolean operator==(const QuickFixVector3 &xx) const;
  358.     QuickFixVector3 operator-(void) const;
  359.     void operator+=(const QuickFixVector3& xx) {fData[0]+=xx.fData[0]; fData[1]+=xx.fData[1]; fData[2]+=xx.fData[2];}
  360.     void operator-=(const QuickFixVector3& xx) {fData[0]-=xx.fData[0]; fData[1]-=xx.fData[1]; fData[2]-=xx.fData[2];}
  361.     void operator>>=(unsigned short ss) {fData[0]>>=ss; fData[1]>>=ss; fData[2]>>=ss;}
  362.     void operator<<=(unsigned short ss) {fData[0]<<=ss; fData[1]<<=ss; fData[2]<<=ss;}
  363.     QuickFixVector3 operator>>(unsigned short ss) const {QuickFixVector3 buf=*this; buf[0]>>=ss; buf[1]>>=ss; buf[2]>>=ss; return(buf);}
  364.     QuickFixVector3 operator<<(unsigned short ss) const {QuickFixVector3 buf=*this; buf[0]<<=ss; buf[1]<<=ss; buf[2]<<=ss; return(buf);}
  365. protected:
  366.     QuickFix fData[3]; 
  367. private:
  368. #if 0
  369.     friend Riostream&  operator<<(Riostream&ss,const QuickFixVector3 &xx);
  370.     friend Riostream&  operator>>(Riostream&ss,QuickFixVector3 &xx);
  371. #endif
  372.      };
  373. QuickFix  operator*(const QuickFixVector3 &UU,const QuickFixVector3 &VV);
  374. QuickFixVector3  operator^(const QuickFixVector3 &UU,const QuickFixVector3 &VV);
  375. QuickFixVector3  operator+(const QuickFixVector3 &UU,const QuickFixVector3 &VV);
  376. QuickFixVector3  operator-(const QuickFixVector3 &UU,const QuickFixVector3 &VV);
  377.  
  378.  
  379. //******************************************************************
  380.  
  381. SignJFS  SetDiscriminant(QuickFix &res,const QuickFix &aa,const QuickFix &bb,const QuickFix &cc);
  382. QuickWide  QuickFixDet(const QuickFixVector2 &V1,const QuickFixVector2 &V2);
  383. QuickFix  QuickNorm(const QuickFix xx, const QuickFix yy);
  384. QuickFix  QuickNorm(const QuickFix xx, const QuickFix yy, const QuickFix zz);
  385. Boolean IntersectLines(const QuickFixVector2 &A1,const QuickFixVector2 &A2,
  386.                               const QuickFixVector2 &B1,const QuickFixVector2 &B2,
  387.                               QuickFixVector2 &res);        
  388.  
  389. //******************************************************************
  390. inline void QuickArcSinCos(const QuickFix &sin,const QuickFix &cos,QuickFix &angle) {
  391.     angle.DegreeSetFromSinCos(sin,cos);
  392.     }
  393.  
  394. inline void QuickSinCos(const QuickFix &angle,QuickFix &sin,QuickFix &cos) {
  395.     angle.DegreeGetSinCos(sin,cos);
  396.     }
  397.  
  398. //******************************************************************
  399. void  InitQuickMath(void);
  400.  
  401. //******************************************************************
  402.  
  403. #ifndef qQFixIsFloat
  404. class  MagicSegmentIntersect {
  405. public:
  406.     MagicSegmentIntersect();
  407.     
  408.     void SetABegin(const QuickFixVector3 &A0) {fA0=A0;}
  409.     void SetAEnd(const QuickFixVector3 &A1) {fA1=A1;}
  410.     void SetBBegin(const QuickFixVector3 &B0) {fB0=B0;}
  411.     void SetBEnd(const QuickFixVector3 &B1) {fB1=B1;    }
  412.     void SetA(const QuickFixVector3 &A0,const QuickFixVector3 &A1) {fA0=A0;fA1=A1;}
  413.     void SetB(const QuickFixVector3 &B0,const QuickFixVector3 &B1) {fB0=B0;fB1=B1;}
  414.     void SetAB(const QuickFixVector3 &A0,const QuickFixVector3 &A1,
  415.                                     const QuickFixVector3 &B0,const QuickFixVector3 &B1) {fA0=A0;fA1=A1;fB0=B0;fB1=B1;}
  416.     void SetOIJH(const QuickFixVector3 &OO,const QuickFixVector3 &II,const QuickFixVector3 &JJ,const QuickFixVector3 &HH);
  417.  
  418.     void GetLamdaMu(QuickFix &ll,QuickFix &mm) {ll=fl;mm=fm;}
  419.     void GetZ(QuickFix &ZA,QuickFix &ZB) {ZA=fZA;ZB=fZB;}
  420.     SignJFS CompareZ(void) {if (fZB>fZA) return (kPos); else if (fZA>fZB) return (kNeg); else return (kZero);}
  421.  
  422.     Boolean DoesIntersect(void);
  423.     Boolean DoesIntersectPlusLamdaMu(void);
  424.     Boolean DoesIntersectPlusSort(void);
  425. protected:
  426.     QuickFixVector3 fA0;
  427.     QuickFixVector3 fA1;
  428.     QuickFixVector3 fB0;
  429.     QuickFixVector3 fB1;
  430.  
  431.     QuickWide        fdet;
  432.     QuickWide        fldet;
  433.     QuickWide        fmdet;
  434.     
  435.     QuickFix    fl;
  436.     QuickFix    fm;
  437.     
  438.     QuickFix    fZA;
  439.     QuickFix    fZB;
  440. };
  441. #endif
  442.  
  443. //******************************************************************
  444.  
  445. struct SSegment {
  446.     long            order;
  447.     long            x1,y1;
  448.     long            x2,y2;
  449.     long            x3,y3;
  450.     long            x4,y4;
  451.     };
  452.  
  453. void  SubdivideSSegment(SSegment *seg,SSegment *left,SSegment *right);
  454. void  GetSSegmentBox(SSegment *seg,long *minx,long *maxx,long *miny,long *maxy);
  455.  
  456. //******************************************************************
  457.  
  458. Riostream&  operator<<(Riostream&ss,const QuickFix &xx);
  459. Riostream&  operator>>(Riostream&ss,QuickFix &xx);
  460. Riostream&  operator<<(Riostream&ss,const QuickFixVector2 &xx);
  461. Riostream&  operator>>(Riostream&ss,QuickFixVector2 &xx);
  462. Riostream&  operator<<(Riostream&ss,const QuickFixVector3 &xx);
  463. Riostream&  operator>>(Riostream&ss,QuickFixVector3 &xx);
  464.  
  465. //******************************************************************
  466.  
  467. #endif
  468.  
  469.